package com.jt.demo1.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

//当前类是工具API,目的获取代理对象
public class JDKProxy {
    /**
     * 参数说明:
     * ClassLoader loader, : 类加载器:将class加载到java运行机制当中
     * Class<?>[] interfaces, : 被代理者的接口的数组,因为java可以多实现
     * InvocationHandler h : 将代理对象扩展的内容写到处理器中
     * @param target
     * @return
     */
    public static Object getProxy(Object target) {
        //1.获取目标对象的类加载器
        ClassLoader loader = target.getClass().getClassLoader();
        //2.获取接口的数组
        Class<?>[] interfaces = target.getClass().getInterfaces();
        //3.获取处理器对象
        InvocationHandler h = getInvocationHandler(target);
        //创建代理对象
        return Proxy.newProxyInstance(loader, interfaces, h);
    }

    //获取InvocationHandler的对象
    public static InvocationHandler getInvocationHandler(Object target) {
        //当代理对象执行业务操作时,通过InvocationHandler进行业务的扩展
        return new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("事务开始");
                //调用,让目标方法执行,target:目标对象!!!其他都是固定写法!!!
                Object result = method.invoke(target, args);
                System.out.println("事务提交");
                return result;
            }
        };
    }
}
